python 实现邮件发送详细解析 附代码(全)

您所在的位置:网站首页 python发送邮件 发送状态 python 实现邮件发送详细解析 附代码(全)

python 实现邮件发送详细解析 附代码(全)

2024-07-16 07:21| 来源: 网络整理| 查看: 265

目录 前言1. 基本逻辑2. smtplib2.1 发送邮件(暂定QQ 163 等)2.2 发送邮件(公司邮箱服务器) 3. zmail3.1 发送邮件3.2 获取邮件内容 4. yagmail

前言

统计某个统计量超过一定的阈值或者设置一个定时任务等,触发发送邮件相关信息来告警,甚至可以用这个功能来做一个发送邮件简单功能,而不是人为发送

以下文章都是针对发送邮件这个功能进行详细阐述

1. 基本逻辑

类似登录服务器需要账号密码端口号 映射一个功能需要映射一个端口号入口或者接口 所以发送邮件 同样需要账号密码的授权以及端口号甚至是这个邮件SMTP或者POP3服务器的授权

具体授权方式通过登录邮件,进入邮件设置中,找到开启的服务(类似服务器开启端口号映射) 以下是qq浏览器,其他浏览器同理,开启POP3的SMTP服务器授权: 在这里插入图片描述

开启之后记录下密码授权,这一串类似邮箱中的密码:(可拥有多个授权码,无需记住也不可泄露) 在这里插入图片描述 有了账号和密码还不够,不同的邮箱有不同的服务器授权(该博文使用的是qq,所以展示qq邮箱的规则)

类型名称地址非SSL端口SSL端口发送SMTPsmtp.qq.com25465/587接收POPpop.qq.com110995接收IMAPimap.qq.com143993

故全局变量的属性如下:

MAIL = { "from": '[email protected]', "pwd": 'xxx', "smtp": 'smtp.qq.com', }

除了发件人还需要一个接收人或者接收的群体:receiver_list = ['[email protected]']

注意事项:

发件人的邮箱要开通SMTP的功能pwd为对应的授权码而不是账号密码需要填写该邮件服务器的smtp,如果涉及端口号也需要填写(此处的qq以及163 可不用端口号即可发送成功) 2. smtplib 2.1 发送邮件(暂定QQ 163 等)

邮件的包中主要通过如下:pip install py-emails

单发邮件:

# -*- coding: utf-8 -*- # !/user/bin/env python # -*- coding:utf-8 -*- import smtplib from email.header import Header from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart MAIL = { "from": '[email protected]', "pwd": 'xxx', "smtp": 'smtp.qq.com', } receiver_list = ['[email protected]'] if __name__ == "__main__": msg = MIMEMultipart('alternative') msg['Subject'] = Header('码农研究僧', 'utf-8') # 标题 msg['From'] = MAIL['from'] # 发件人 msg['To'] = receiver_list[0] # 收件人 # 内容 content = "你好,感谢你的观看" # 此正文消息,参数为内容、编码格式(plain纯文本)、编码方式 html_message = MIMEText(content, 'plain ', 'utf-8') # 正文 html_message["Accept-Language"] = "zh-CN" html_message["Accept-Charset"] = "ISO-8859-1,utf-8" msg.attach(html_message) try: # 非SSL,如果为SSL则看下面 server = smtplib.SMTP(MAIL['smtp']) # 如果是ssl,需要加多一个端口号映射 # server = smtplib.SMTP_SSL() # server.connect(MAIL['smtp'],MAIL['port']) # 登陆邮箱发送邮件 server.login(MAIL['from'], MAIL['pwd']) server.sendmail(MAIL['from'], receiver_list, msg.as_string()) print('发送成功') except Exception as e: print('error', e)

发送成功之后: 在这里插入图片描述 如果说是群发邮件,则邮件应该添加多个人的邮箱 而且处理每个人的时候需要加上分号分割:msg['To'] = ";".join(receiver_list)

2.2 发送邮件(公司邮箱服务器)

对于公司的邮箱服务器比较特殊,处理的方式和上面有些差异

默认的STMP是开启的,所以不需要找什么授权码,毕竟也无法打开:

在这里插入图片描述

对此上述的代码需要稍微小改下:

pwd为密码 而不是授权码对应的端口号可更改,毕竟默认25端口号比较危险!账号密码登录的时候,账号不需要到com,只需要填写账号即可公司的smtp服务器查看通过邮箱设置中查看! # 注意此处不需要写具体到com,只需要填补账号信息即可 # server.login(MAIL['from'], MAIL['pwd']) server.login("manongyanjiuseng", MAIL['pwd'])

可默认修改端口号: (注意此处的发件服务器为smtp的服务器地址,前提一定要可以发送!) 在这里插入图片描述

类似的测试代码如下:(和上述代码一致,只不过为了好看而已)

import smtplib from email.mime.text import MIMEText from email.header import Header if __name__ == "__main__": # 第三方 SMTP 服务 mail_host = "mail.域名.com" # 设置服务器 mail_user = "manongyanjiuseng" # 用户名 mail_pass = "xx" # 密码 sender = '[email protected]' receivers = ['[email protected]'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 content = "测试邮件" message = MIMEText(content, 'plain', 'utf-8') message['From'] = Header("发送者", 'utf-8') message['To'] = Header("接收者", 'utf-8') subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(mail_user, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print("邮件发送成功") except smtplib.SMTPException: print("Error: 无法发送邮件")

最终截图如下:

在这里插入图片描述

3. zmail

zmail的版本是python3以上,该包不需要引入邮件服务器端口号(会自动寻找)

需要pip安装才可导入zmail包:pip install zmail 在这里插入图片描述

3.1 发送邮件

具体发送邮件的相关代码如下: 单发和群发的区别在于接收的人数多与少,通过";".join(receiver_list)即可实现

import zmail MAIL = { "from": '[email protected]', "pwd": 'xxx' } receiver_list = ['[email protected]'] MAIL_CONTENT = { 'subject':"码农研究僧", 'content_text':'这是 邮件相关代码', 'attachments':r'B:\python\mail.py' } if __name__ == "__main__": try: # 登录邮箱 server = zmail.server(MAIL['from'],MAIL['pwd']) # 发送邮件 server.send_mail(receiver_list[0], MAIL_CONTENT) print('发送成功') except Exception as e: print('error', e)

发送成功之后,通过查看邮件也可看到相关的附件: 在这里插入图片描述

对比具体附件的相关信息(验证正确):

在这里插入图片描述 有无附件通过定义有无这个值即可,'attachments':

如果邮件内容中有附件,也可对应获取邮件附件内容:

mail = server.get_latest() # 附件别名省略,则自带默认的邮件名获取 zmail.get_attachment(mail,'附件别名')

如果有端口号或者服务器的限制,请加上

server = zmail.server(MAIL['from'],MAIL['pwd'],smtp_host=MAIL['smtp'],smtp_port=MAIL['port']) 3.2 获取邮件内容

通过这个包也可进行接收邮件:

import zmail MAIL = { "from": '[email protected]', "pwd": 'xxx' } if __name__ == "__main__": try: server = zmail.server(MAIL['from'],MAIL['pwd']) mail = server.get_latest() zmail.show(mail) print('获取成功') except Exception as e: print('error', e)

成功执行之后会获得最新邮件的信息:server.get_latest(),这是详细信息 具体信息如下:

------------------------- Subject 码农研究僧 Id 56 From [email protected] To [email protected] Date None Content_text ['你好,感谢你的观看'] Content_html [] Attachments 发送成功

也可通过这些信息可筛选出邮件内容: 比如通过获取邮件的subject,或者通过邮件的id或者这封邮件的具体信息:

mail = server.get_mail(56) print (mail)

具体内容如下:

{'content_text': ['你好,感谢你的观看'], 'content_html': [], 'attachments': [], 'headers': {'Received': 'from [ip地址] ([[ip地址])by 。。。 发送成功

如果获取邮件的简述信息(邮件id数、邮件大小),通过server.stat()

mail = server.stat() print (mail)

如果获取特定邮件的内容,甚至是按照时间点获取,可以通过get_mails函数 查看其原函数,其他参数可带如下内容筛选: 在这里插入图片描述 其函数参数如下:

参数描述subject邮件主题start_time开始时间end_time结束时间sender发送者start_index开始idend_index结束id

示例代码如下:

mails = server.get_mails(subject='码农研究僧') for mail in mails: zmail.show(mails)

截图如下: 在这里插入图片描述

4. yagmail

同样需要导入这个包:pip install yagmail 在这里插入图片描述 示例代码如下:

import yagmail MAIL = { "from": '[email protected]', "pwd": 'xxx', "smtp": 'smtp.qq.com', } receiver_list = ['[email protected]'] MAIL_CONTENT = { 'subject':"码农研究僧", 'content_text':'这是 邮件相关代码', 'attachments':r'B:\python\mail.py' } if __name__ == "__main__": try: # 登录邮箱 server = yagmail.SMTP(MAIL['from'],MAIL['pwd'],MAIL['smtp']) # 发送邮件 server.send(receiver_list[0],MAIL_CONTENT['subject'],MAIL_CONTENT['content_text'],MAIL_CONTENT['attachments']) server.close() print('发送成功') except Exception as e: print('error', e)

结果如下: 在这里插入图片描述 补充:关于send函数的部分参数说明: 在这里插入图片描述

描述如下:

参数描述to发件人subject标题contents内容attachments附件


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3